/* Universidad del Valle de Guatemala
 * CC2003 - Algoritmos y Estructuras de Datos
 * PROYECTO #1: RURPLE ME
 * Fecha de Entrega: Jueves 11 de Agosto de 2011
 */

/**
 * Midlet de la aplicacion RURPLE ME. 
 * @author Jose Antonio Bagur (10275), Luis Antonio Siguenza (10297) y Emilo Jose Miranda (10411).
 */

/* SE CARGAN LOS PAQUETES A UTILIZAR EN LA CLASE */
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/* SE HEREDAN LOS MÉTODOS Y ATRIBUTOS DEL PAQUETE MIDLET Y SE IMPLEMENTAN LOS DEL PAQUETE COMMANDLISTENER */
public class PrincipalRurple extends MIDlet implements CommandListener {    
    
    /* ATRIBUTOS DE LA CLASE PRINCIPALRURPLE */
    
    /* COMANDOS DE LA VENTANA PRINCIPAL */
    private Command salir;                                                      // SALIR DE LA APLICACIÓN
    private Command script;                                                     // EDITAR SCRIPT
    private Command mapa;                                                       // EDITAR MAPA
    
    /* COMANDOS DEL SCRIPT */
    private Command script1;                                                    // ABRIR
    private Command script2;                                                    // GUARDAR
    private Command script3;                                                    // BORRAR TODO
    private Command script4;                                                    // SELECCIONAR
    
    /* COMANDOS DEL MAPA */
    private Command mapa1;                                                      // ABRIR
    private Command mapa2;                                                      // GUARDAR
    private Command mapa3;                                                      // BORRAR TODO
    private Command mapa4;                                                      // SELECCIONAR
    private Command cargar_mapa;                                                // CARGA EL MAPA SELECCIONADO
    private Command cargar_script;                                              // CARGA EL SCRIPT SELECCIONADO 
    private Command siguiente;                                                  // REALIZA LAS INSTRUCCIONES DEL SCRIPT
        
    /* REGRESAR A LA PANTALLA ANTERIOR */
    private Command atras1;
    private Command atras2;
    private Command atras3;
    private Command atras4;
    
    /* CONTINUAR CON LA APLICACIÓN LUEGO DE UN MENSAJE */
    private Command aceptar1;
    private Command aceptar2;     
    
    /* ENVIAR MENSAJES DE TEXTO (SMS) */
    private Command enviar_sms;
    private Command enviar;
        
    /* PANTALLA PRINCIPAL DE LA APLICACIÓN */
    private Display screen;
    
    /* PANTALLA DE BIENVENIDA A LA APLICACIÓN */
    private MenuRurple inicio;
    
    /* SCRIPTS */
    private TextBox codigo_script;                                              // ESPACIO PARA INGRESAR EL SCRIPT
    private List lista_script;                                                  // LISTA DE SCRIPTS ALMACENADOS
    
    /* MAPAS */
    private TextBox codigo_mapa;                                                // ESPACIO PARA INGRESAR EL SCRIPT EN EL MAPA
    private List lista_mapa;                                                    // LISTA DE MAPAS ALMACENADOS
    
    /* MENSAJES DE TEXTO */
    private Form sms;
    private TextField telefono;                                                 // ESPACIO PARA ESCRIBIR EL TELÉFONO
    private StringItem mensaje;                                                 // ESPACIO PARA MOSTRAR EL CÓDIGO A ENVIAR 
    private ArchivosRurple archivo;                                             // MANEJO DE ARCHIVOS
    
    /* MENSAJES AL USUARIO RESPECTO AL ALMACENAMIENTO DE ARCHIVOS */
    private Alert mensaje1;
    private Alert mensaje2;
    private Alert mensaje3;
    private Alert mensaje4;     
    
    /* CREA CÓDIGO DEL MAPA E INTERPRETA SCRIPT */
    private RobotRurple rurple; 
    
    private boolean bandera1;                                                   // DETERMINA SI ESTÁ EJECUTANDO (FALSE) O CARGANDO UN SCRIPT (TRUE).
    private boolean bandera2;                                                   // DETERMINA SI ESTÁ EN LISTA DE SCRIPTS (FALSE) O LISTA DE MAPAS (TRUE).
     
    /**
     * Constructor de la clase PrincipalRurple, inicializa el estado del MIDlet.
     */
    public PrincipalRurple() {
        bandera1 = false;
        bandera2 = false;        
        
        screen = Display.getDisplay(this);

        salir = new Command("Salir", Command.EXIT, 0);        
        script = new Command("Script", Command.SCREEN, 0);
        mapa = new Command("Mapa", Command.SCREEN, 0);        
        
        script1 = new Command("Abrir", Command.SCREEN, 0);
        script2 = new Command("Guardar", Command.SCREEN, 0);        
        script3 = new Command("Borrar todo", Command.SCREEN, 0);
        script4 = new Command("Seleccionar", Command.SCREEN, 0);
        
        mapa1 = new Command("Abrir", Command.SCREEN, 0);
        mapa2 = new Command("Guardar", Command.SCREEN, 0);        
        mapa3 = new Command("Borrar todo", Command.SCREEN, 0);
        mapa4 = new Command("Seleccionar", Command.SCREEN, 0);
        
        cargar_mapa = new Command("Cargar mapa", Command.SCREEN, 0);
        cargar_script = new Command("Cargar script", Command.SCREEN, 0);   
        siguiente = new Command("Siguiente", Command.OK, 0);
        
        aceptar1 = new Command("Aceptar", Command.SCREEN, 0);
        aceptar2 = new Command("Aceptar", Command.SCREEN, 0);        
        atras1 = new Command("Atras", Command.BACK, 0);
        atras2 = new Command("Atras", Command.BACK, 0);
        atras3 = new Command("Atras", Command.BACK, 0);  
        atras4 = new Command("Atras", Command.BACK, 0);
        
        enviar_sms = new Command("Enviar mensaje", Command.SCREEN, 0);
        enviar = new Command("Enviar", Command.OK, 0);

        /* PANTALLA INICIAL */
        inicio = new MenuRurple();
        inicio.addCommand(salir);
        inicio.addCommand(script);
        inicio.addCommand(mapa);        
        inicio.setCommandListener(this);
        
        /* SCRIPTS */
        codigo_script = new TextBox("script", "", 200, TextField.NUMERIC);  
        codigo_script.addCommand(atras1);
        codigo_script.addCommand(script1);
        codigo_script.addCommand(script2);
        codigo_script.addCommand(enviar_sms);        
        codigo_script.addCommand(script3);
        codigo_script.setCommandListener(this);        
        
        lista_script = new List("Lista de Scripts", List.EXCLUSIVE);
	lista_script.addCommand(atras2);
	lista_script.addCommand(script4);
	lista_script.setCommandListener(this);       
        
        /* MAPAS */
        codigo_mapa = new TextBox("Script Mapa", "", 98, TextField.NUMERIC);  
        codigo_mapa.addCommand(atras1);
        codigo_mapa.addCommand(mapa1);
        codigo_mapa.addCommand(mapa2);
        codigo_mapa.addCommand(enviar_sms);
        codigo_mapa.addCommand(cargar_mapa);        
        codigo_mapa.addCommand(mapa3);
        codigo_mapa.setCommandListener(this);
        
        lista_mapa = new List("lista de Mapas", List.EXCLUSIVE);
        lista_mapa.addCommand(atras3);
        lista_mapa.addCommand(mapa4);
        lista_mapa.setCommandListener(this);
        
        /* MENSAJE DE TEXTO */
        telefono = new TextField("Teléfono:", "", 8, TextField.NUMERIC);
        mensaje = new StringItem("Mensaje", "");
        sms = new Form("SMS", new Item[] { telefono, mensaje });
        sms.addCommand(atras4);
        sms.addCommand(enviar);
        sms.setCommandListener(this);
        archivo = new ArchivosRurple();
        
        /* MENSAJE PARA CÓDIGO_SCRIPT */
        mensaje1 = new Alert("Archivo Guardado", "Su archivo ha sido guardado exitosamente", null, AlertType.INFO);
        mensaje1.setTimeout(Alert.FOREVER);
        mensaje1.addCommand(aceptar1);
        mensaje1.setCommandListener(this);
        
        mensaje2 = new Alert("Borrado", "", null, AlertType.INFO);
        mensaje2.setTimeout(Alert.FOREVER);
        mensaje2.addCommand(aceptar1);
        mensaje2.setCommandListener(this);
        
        /* MENSAJES PARA CÓDIGO_MAPA */
        mensaje3 = new Alert("Archivo Guardado", "Su archivo ha sido guardado exitosamente", null, AlertType.INFO);
        mensaje3.setTimeout(Alert.FOREVER);
        mensaje3.addCommand(aceptar2);
        mensaje3.setCommandListener(this);
        
        mensaje4 = new Alert("Borrado", "", null, AlertType.INFO);
        mensaje4.setTimeout(Alert.FOREVER);
        mensaje4.addCommand(aceptar2);
        mensaje4.setCommandListener(this);
               
        rurple = new RobotRurple();
        rurple.addCommand(atras1);
        rurple.addCommand(cargar_script);        
        rurple.setCommandListener(this);
    }

    /**
     * Método que ejecuta el MIDlet.
     */
    public void startApp() {
        screen.setCurrent(inicio);
        new BienvenidaRurple(screen, inicio);
    }

    public void pauseApp() {
    }
    
    /**
     * Método que finaliza la ejecución de la aplicación 
     * @param unconditional 
     */
    public void destroyApp(boolean unconditional) {
    }
    
    /**
     * Método que designa a los comandos del programa, las acciones a realizar cuando sean invocados.
     * @param c Command
     * @param d Displayable
     */
    public void commandAction(Command c, Displayable d) {
        
        /* SCRIPT */
        if (c == script) {
            bandera2 = false;            
            codigo_script.setString(""); //Borrar contenido 
            screen.setCurrent(codigo_script);
        }
        
        /* SCRIPT - ABRIR */
        if (c == script1) {
            bandera1 = false;
            
            lista_script.deleteAll();
            archivo.abrir("Scripts");

            for (int i = 0; i < archivo.cantidad(); i++) {
                lista_script.insert(0, "Script" + String.valueOf(archivo.cantidad() - i), null);
            }

            archivo.cerrar();
            screen.setCurrent(lista_script);
        }
        
        /* SCRIPT - GUARDAR */
        if (c == script2) {
            archivo.abrir("Scripts");
            archivo.escribir(codigo_script.getString());
            archivo.cerrar();
            screen.setCurrent(mensaje1);            
        }        
        
        /* SCRIPT - BORRAR TODO */
        if (c == script3) {
            String mensaje = archivo.borrarTodo("Scripts");
	    mensaje2.setString(mensaje);
	    screen.setCurrent(mensaje2);
        }
        
        /* SCRIPT - ABRIR - SELECCIONAR */
        if (c == script4) {
            int seleccionado = lista_script.getSelectedIndex() + 1;
            archivo.abrir("Scripts");
            String contenido = archivo.leer(seleccionado);
            archivo.cerrar();
            codigo_script.setString(contenido);

            if (bandera1 == false) {
                screen.setCurrent(codigo_script);
            } else {                
                rurple.generarScript(codigo_script.getString()); 
                rurple.removeCommand(cargar_script);
                rurple.addCommand(siguiente);                
                screen.setCurrent(rurple);                
            }
        }
        
        /* MAPA */
        if (c == mapa) {
            bandera2 = true;            
            codigo_mapa.setString(""); //Borrar contenido 
            screen.setCurrent(codigo_mapa);
        }
        
        /* MAPA - ABRIR */
        if (c == mapa1) {
            lista_mapa.deleteAll();
            archivo.abrir("Mapas");

            for (int i = 0; i < archivo.cantidad(); i++) {
                lista_mapa.insert(0, "Mapa" + String.valueOf(archivo.cantidad() - i), null);
            }

            archivo.cerrar();
            screen.setCurrent(lista_mapa);
        }
        
        /* MAPA - GUARDAR */
        if (c == mapa2) {
            archivo.abrir("Mapas");
            archivo.escribir(codigo_mapa.getString());
            archivo.cerrar();
            screen.setCurrent(mensaje3);            
        }
        
       /* SCRIPT/MAPA - ENVIAR MENSAJE */
        if (c == enviar_sms) {
            if (bandera2 == false) {
                mensaje.setText(codigo_script.getString());   
                screen.setCurrent(sms);
            } else {
                mensaje.setText(codigo_mapa.getString());
                screen.setCurrent(sms);
            }                        
        }
        
        /* SCRIPT/MAPA - ENVIAR MENSAJE/ MAPA - ENVIAR */
        if (c == enviar) {
            SMSRurple msg = new SMSRurple();
            msg.mandar(telefono.getString(), mensaje.getText());
        }
        
        /* MAPA - CARGAR/MAPA */
        if (c == cargar_mapa) {
            rurple.generarMapa(codigo_mapa.getString());
            screen.setCurrent(rurple);
        }
        
        /* MAPA - CARGAR MAPA/SCRIPT */
        if (c == cargar_script) {
            bandera1 = true;
            
            lista_script.deleteAll();
            archivo.abrir("Scripts");

            for (int i = 0; i < archivo.cantidad(); i++) {
                lista_script.insert(0, "Script" + String.valueOf(archivo.cantidad() - i), null);
            }

            archivo.cerrar();
            screen.setCurrent(lista_script);
        }
        
        /* MAPA - CARGAR MAPA/SCRIPT - SIGUIENTE */
        if (c == siguiente) {
            rurple.siguienteMovimiento();
            screen.setCurrent(rurple);
        }       
        
        /* MAPA - BORRAR TODO */
        if (c == mapa3) {
            String mensaje = archivo.borrarTodo("Mapas");
	    mensaje2.setString(mensaje);
	    screen.setCurrent(mensaje4);            
        }
        
        /* MAPA ABRIR - SELECCIONAR */
        if (c == mapa4) {
            int seleccionado = lista_mapa.getSelectedIndex() + 1;                   
            archivo.abrir("Mapas");
            String contenido = archivo.leer(seleccionado);
            archivo.cerrar();
            codigo_mapa.setString(contenido);
            screen.setCurrent(codigo_mapa);
        }
        
        /* SCRIPT/MAPA - ATRAS */
        if (c == atras1) {
            rurple = new RobotRurple();
            rurple.addCommand(atras1);
            rurple.addCommand(cargar_script);        
            rurple.setCommandListener(this);
            screen.setCurrent(inicio);            
        }
        
        /* SCRIPT ABRIR - ATRAS */
        if (c == atras2) {
            if (bandera1 == false) {
                screen.setCurrent(codigo_script);
            } else {
                screen.setCurrent(rurple);
            }            
        }
        
        /* MAPA - CARGAR MAPA - ATRAS */
        if (c == atras3) {
            screen.setCurrent(codigo_mapa);
        }  
        
        /* SCRIPT/MAPA - ENVIAR MENSAJE/MAPA */
        if (c == atras4) {
            if (bandera2 == false) {
                screen.setCurrent(codigo_script);
            } else {
                screen.setCurrent(codigo_mapa);
            }            
        }
        
        /* SCRIPT - GUARDAR */
        if (c == aceptar1) {
            screen.setCurrent(codigo_script);
        }
        
        /* MAPA - GUARDAR */
        if (c == aceptar2) {
            screen.setCurrent(codigo_mapa);
        }
        
        /* SALIR */
        if (c == salir) {
            destroyApp(false);
            notifyDestroyed();
        }
    }
} // FIN DE LA CLASE PRINCIPALRURPLE 